// 专门处理电影的后台接口
var express = require("express");
var router = express.Router(); //express的路由
var async = require('async'); //异步流程控制（串行有关联）
var MongoClient = require('mongodb').MongoClient; //引入路由，使用路由
var url = 'mongodb://127.0.0.1:27017/'; //就好像http协议


// 获取影片列表 location:3000/api/films/list
router.get('/list', function (req, res) {
  var pageNum = parseInt(req.query.pageNum) || 1; // 当前第几页
  var pageSize = parseInt(req.query.pageSize) || 5; // 每页显示多少条
  var type = parseInt(req.query.type) || 1; // 影片的类型，正在上映和即将上映，1-正在上映，2-即将上映

  // 1.需要获取到整个影片的数据条数，-根据type 来区分是正在上映，还是即将上映
  // 2.根据传递过来的参数计算。skip limit
  // 判断是正在上映，还是即将上映
  var param = {};
  if (type === 1) {
    // 正在热映
    param = {
      premiereAt: { //本地时间是毫秒/1000=秒，电影的上线时间，本地时间大于电影时间就是正在上映的。否则。
        $lt: new Date().getTime() / 1000
      }
    }
  } else {
    // 即将上映
    param = {
      premiereAt: {
        $gte: new Date().getTime() / 1000
      }
    }
  }


  // Mongodb数据库.链接
  MongoClient.connect(url, {
    useNewUrlParser: true
  }, function (err, client) {
    if (err) {
      // 前端调后台的接口返回来的是json格式,前端看的
      console.log('链接数据库失败', err);
      res.json({
        code: 1,
        msg: '网络异常，请稍后重试',
      })
    } else {
      // 否则链接成功
      var db = client.db('mazuo');

      // 使用串行有关联,上面有错就不会继续执行下去。。。第一个是数组，第二个是最终的回调函数
      async.waterfall([
        // 有几个异步就写几个function
        function (cb) {
          db.collection('film').find(param).count(function (err, num) {
            if (err) {
              cb(err);
            } else {
              cb(null, num);
            }
          })
        },

        function (num, cb) {
          db.collection('film').find(param).skip(pageSize * pageNum - pageSize).limit(pageSize).toArray(function (err, data) {
            if (err) {
              cb(err);
            } else {
              cb(null, {
                num: num,
                data: data
              });
            }
          })

        }

      ], function (err, result) {
        if (err) {
          console.log(err);
          res.json({
            code: 1,
            msg: '错误'
          })
        } else {
          res.json({
            code: 0,
            msg: 'OK',
            data: {
              films: result.data,
              total: result.num
            }
          })
        }
        // 结束，不再执行下去
        client.close();
      })
    }
  });

});

// 获取详情页数据
router.get('/details', function (req, res) {
  var filmIdOne = Number(req.query.filmId); //获取url传过来的查询串，是字符串，转成Number
  // console.log(filmIdOne);

  // 开始请求数据库,connect:链接
  MongoClient.connect(url, {
    useNewUrlParser: true
  }, function (err, client) {
    if (err) {
      console.log('链接数据库失败' + err);
      res.json({ //以json格式输出
        code: 1, //返回1 是错误
        msg: '网络异常，请稍后重试'
      })
    } else {
      //  否则链接成功
      var db = client.db('mazuo');
      // 数据库采集（表）.查找什么什么。
      db.collection('details').find({
        "filmId": filmIdOne
      }).toArray(function (err, result) { //toArray:转为数组。错误，结果
        if (err) {
          console.log('数据查询失败');
          res.json({
            code: 1, //返回1 是错误
            msg: '加载异常，请重新加载'
          })
        } else {
          res.json({
            code: 0,
            msg: '数据请求成功',
            data: result
          })
          // 结束请求
          client.close();
        }
      })

    }
  })

})

// 注册操作
router.post('/enroll', function (req, res) {
  let phoneEnter = req.body.params.phone; //接收前端的用户数据
  let codeEnter = req.body.params.code;
  // console.log(phoneEnter, codeEnter)
  // 链接数据库
  MongoClient.connect(url, {
    useNewUrlParser: true
  }, function (err, client) {
    if (err) {
      console.log('链接数据库失败');
      res.json({ //返回给前端，并退出
        code: 4,
        msg: '网络异常，请稍后重试'
      })
      return;
    };
    console.log('链接数据库成功');
    let db = client.db('mazuo');

    // 有注册又登陆的就要使用，串行无关联,有错误直接带错误到最后的回调函数一起返回给前端。
    async.series([
      function (cb) {
        db.collection('user').find({
          userName: phoneEnter
        }).count(function (err, num) {
          if (err) {
            console.log('查找用户失败');
            cb(err)
          } else if (num > 0) {
            console.log('此用户已经被注册了');
            cb('此用户已经被注册了');
          } else {
            // 可以注册
            cb(null);
          }
        })
      },
      // 开始注册信息到数据库
      function (cb) {
        db.collection('user').insertOne({
          userName: phoneEnter,
          password: codeEnter
        }, function (err) {
          if (err) {
            console.log(err);
            cb('注册有失误'); //失败，cb错误到下一行
          } else {
            cb(null); //注册成功让他走下一步
          }
        })
      }
    ], function (err, result) {
      if (err) {
        res.json({ // 注册失败返回前端
          code: 1,
          msg: err,
        })
        return;
      } else {
        // 注册成功返回前端
        console.log('注册成功');
        res.json({
          code: 0,
          msg: '注册成功'
        })
      }
      // 不管成功还是失败都退出
      client.close();
    })

  })
})

// 登录操作
router.post('/register', function (req, res) {
  let userNameInput = req.body.params.userPhone; //接收前端传来的userPhone数据
  let passwordInput = req.body.params.pwdInput;
  // console.log(userNameInput, passwordInput)

  // 链接数据库
  MongoClient.connect(url, {
    useNewUrlParser: true
  }, function (err, client) {
    if (err) {
      res.json({
        code: 1,
        msg: '链接数据库失败'
      })
    } else {
      var db = client.db('mazuo');
      db.collection('user').find({
        //查询数据库的=不= 与前端的数据
        userName: userNameInput,
        password: passwordInput
      }).toArray(function (err, data) {
        if (err) {
          res.json({
            code: 1,
            msg: '查询错误'
          })
        } else if (data <= 0) {
          res.json({
            code: 1,
            msg: '用户名或者密码错误'
          })
        } else {
          res.json({
            code: 0,
            msg: '登录成功'
          })

        }

        // 结束进程
        client.close();
      })
    }

  })
})

// 9.9拼团
router.get('/group', function (req, res) {
  // console.log(req)
  MongoClient.connect(url, {
    useNewUrlParser: true
  }, function (err, client) {
    if (err) {
      // console.log(err);
      res.json({
        code: 1,
        msg: '网络异常，请稍后重试'
      })
    } else {
      var db = client.db('mazuo');
      db.collection('booking').find().toArray(function (err, result) {
        if (err) {
          res.json({
            code: 1,
            msg: '拉取数据失败'
          })
        } else {
          res.json({
            code: 0,
            msg: '拉取数据成功',
            data: result
          })
        }
      })
    }
  })
})

// 影院城市
router.get('/cinemaCity', function (req, res) {
  var filmCityId = req.query.filmCity;
  console.log(filmCityId);
  MongoClient.connect(url, {
    useNweUrlParser: true
  }, function (err, client) {
    // 如果连接失败
    if (err) {
      console.log('链接数据库错误');
      res.json({
        code: 1,
        msg: '网络异常，请稍后重试'
      })
      return;
    } else {
      // 否则成功，开始连接数据库
      var db = client.db('mazuo');
      db.collection('cityFilm').find({
        cityName: filmCityId + '市'
      }).toArray(function (err, result) {
        if (err) {
          res.json({
            code: 1,
            msg: '拉取数据失败'
          })
        } else {
          res.json({
            //返回前端
            code: 0,
            msg: '拉取数据成功',
            data: result
          })
        }
        // 关闭链接
        client.close();
      })
    }
  })
})

// 城市分类定位
router.get('/citySite', function (req, res) {
  // console.log(req)
  MongoClient.connect(url, {
    useNewUrlParser: true
  }, function (err, client) {
    if (err) {
      console.log('链接数据库失败')
      res.json({
        code: 1,
        msg: '链接数据库失败'
      })
      return;
    } else {
      // 链接数据库成功
      var db = client.db('mazuo');
      db.collection('cityDing').find().toArray(function (err, result) {
        if (err) {
          console.log('数据拉取失败');
          res.json({
            code: 1,
            msg: '数据拉取失败'
          })
        } else {
          res.json({
            code: 0,
            msg: '数据拉取成功',
            data: result
          })
        }
        // 关闭当前的链接
        client.close();
      })
    }
  })
})
module.exports = router; //暴露
